- 问题: Could not reserve enough space for object heap
- 答案: 系统默认分配的堆内存不够, 可在catalina.sh开头添加: JAVA_OPTS=”-Xmx1024m”. 其中1024可以更改
Java-Note-JVM-Cannot-find-seclasspath-sh
2018-05-15
Java
- 问题: Cannot find /users/ems/tomcat/bin/setclasspath.sh
- 原因: 跟环境变量有关, 在catalina.sh中的配置和/etc/profile中的配置不匹配
Java-Note-Debug-使用Intellij对应用进行远程调试
2018-05-11
Java
- 环境配置
- 远程服务器
- 操作系统: centos 6.5
- tomcat版本: 8.0
- 远程服务器
步骤
- 打开端口8000(如果是云服务器还需打开8000端口的入站流量)
修改远程tomcat服务器配置: 使用catalina.sh代替startup.sh来启动
关闭远程tomcat:
1
2cd /var/tomcat/tomcat-8/bin
./shutdown.sh修改catalina.sh中的代码, 将
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16if [ "$1" = "jpda" ] ; then
if [ -z "$JPDA_TRANSPORT" ]; then
JPDA_TRANSPORT="dt_socket"
fi
if [ -z "$JPDA_ADDRESS" ]; then
JPDA_ADDRESS="localhost:8000"
fi
if [ -z "$JPDA_SUSPEND" ]; then
JPDA_SUSPEND="n"
fi
if [ -z "$JPDA_OPTS" ]; then
JPDA_OPTS="-agentlib:jdwp=transport=$JPDA_TRANSPORT,address=$JPDA_ADDRESS,server=y,suspend=$JPDA_SUSPEND"
fi
CATALINA_OPTS="$CATALINA_OPTS $JPDA_OPTS"
shift
fi中的
JPDA_ADDRESS="localhost:8000"改为JPDA_ADDRESS="0.0.0.0:8000". 因为0.0.0.0表示所有的ip地址都可以访问,JPDA是指Java Platform Debugger Architecture, 是一种专门用于Java调试的架构: JPDA.- 重启tomcat:
./catalina.sh jpda start
- 修改本地Intellij配置
- 在
Edit Configuration中增加一个Remote, 将里面的Port改为8000, 保存然后点击debug按钮 - 当出现
Connected to the target VM, address: '140.143.29.99:8000', transport: 'socket'时表示远程连接调试端口成功, 可以开始调试
- 在
- 注意: 在步骤3的1中, 如果出现
Unable to open debugger port (x.x.x.x:8000): java.net.ConnectException "Connection refused: connect"说明调试端口为对客户端开放, 此时可以在远程服务器上使用netstat -ntlp查看开放的端口, 有可能没有开放8000端口或者开放的是127.0.0.1:8000而不是0.0.0.0:8000
Java-Note-Spring-415-Unsupported-Media-Type
2018-05-11
Java
用postman向服务端发送请求时报错, 使用的
content-type是application/json:1
2
3HTTP Status 415 – Unsupported Media Type
Type Status Report
Description The origin server is refusing to service the request because the payload is in a format not supported by this method on the target resource.原因:
- 在请求头中未加入
Content-Type:application/json - 如果排除
1依然报错, 则是因为没有相应的处理json的包, 如com.google.code.gson/com.fasterxml.jackson.core. 如果没有这类包, 则依旧会报这个错误, 因为java和spring自己没有解析json的功能, 需要借助第三方包
- 在请求头中未加入
Java-Note-JVM-Java堆和Native堆
2018-05-10
Java
- Native堆属于非Java堆
- 引入原因: JVM与外界通讯, 把Java堆中的内容传输到外界, 需要把Java堆复制到非Java堆, 如果使用Native堆并在Java堆中保存其引用, 可以避免内容在Java堆和非Java堆之间的copy
- 注意
- 非Java堆得回收不受Java young gc的影响, 需要手工回收. 大量使用丢失Java自动垃圾回收的特点
- 一般使用费Java堆进行和外界的通讯, 并且作为缓存使用. 如DirectByteBuffer
Java-Note-Reference
2018-05-10
Java
Java-Note-引用
2018-05-10
Java
引用:
- C++中的引用: 与指针相比:
- 没有null 引用
- 引用必须有初值
- 使用引用要比使用指针效率高, 因为引用不用测试其有效性
- 指针可以重新赋值, 而引用总是指向它最初获得的对象
- Java中的引用: 与C++中的引用相比, 不过是穿着引用外衣的指针而已
例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38public class ValueTransmit {
public static void main(String[] args) {
ValueObject valueObject1 = new ValueObject();
System.out.println("old preprocess: " + valueObject1.value);
changeOldObject(valueObject1);
System.out.println("old processed: " + valueObject1.value);
ValueObject valueObject2 = new ValueObject();
System.out.println("new preprocess: " + valueObject2.value);
changeNewObject(valueObject2);
System.out.println("new processed: " + valueObject2.value);
}
public static void changeOldObject(ValueObject valueObject) {
valueObject.value = 5;
System.out.println("old processing: " + valueObject.value);
}
public static void changeNewObject(ValueObject valueObject) {
valueObject = new ValueObject();
valueObject.value = 5;
System.out.println("new processing: " + valueObject.value);
}
}
class ValueObject {
public int value;
public ValueObject() {
value = 1;
}
}/* Output:
old preprocess: 1
old processing: 5
old processed: 5
new preprocess: 1
new processing: 5
new processed: 1
*///:~疑问: 为何把
valueObject引用指向一个newValueObject后, 处理的结果没有发生变化呢- 答案: 因为方法参数是将实际参数复制一份压入栈中, 而
valueObject引用如果指向的是newValueObject的话,value的改变发生在newValueObject, 而不是oldValueObject
- C++中的引用: 与指针相比:
Java-Note-Spring-Autowired
2018-04-25
Java
- @Autowired: 可以将指定bean自动注入, 以避免使用
<bean>下面的<preporty>来设置 - 使用@Autowired需要在xml中配置
<context:annotation-config>标签<context:annotation-config>is used to activate annotations in beans already registered in the application context (no matter if they were defined with XML or by package scanning). and<context:component-scan>can also do what<context:annotation-config>does but<context:component-scan>also scans packages to find and register beans within the application context.
XML-Note-相关知识
2018-04-25
XML
- XSD: XML Schema Defination, is a World Wide Web Consortium(W3C) recommendation that specifies how to formally describe the elements in an Extensible Markup Language(XML) document
beans标签中的属性:
Java-Note-通过相对位置读取文件
2018-04-23
Java
- 项目代码中:
- 想要读取项目下的文件, 又不希望写死路径, 可以把路径写为: “src/…”
- 浏览器中: 浏览器中读取服务器的文件
- 在tomcat的service.xml进行一下修改(Context标签):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Context path="/custom_api/static" docBase="\custom_api\WEB-INF\static"
reloadable="true" debug="0"/>
<Context path="/custom_api" docBase="D:\runtime\jnScience"
reloadable="true" debug="0"/>
<!-- SingleSignOn valve, share authentication between web applications
Documentation at: /docs/config/valve.html -->
<!--
<Valve className="org.apache.catalina.authenticator.SingleSignOn" />
-->
<!-- Access log processes all example.
Documentation at: /docs/config/valve.html
Note: The pattern used is equivalent to using pattern="common" -->
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
- 在tomcat的service.xml进行一下修改(Context标签):